iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
Software Development

挑戰用JavaScript刷LeetCode的Top Interview Questions系列 第 4

刷LeetCode-Top Interview Questions 陣列篇4

  • 分享至 

  • xImage
  •  

主題:Array

Single Number

判斷陣列中重複的element是什麼,並回傳

思考邏輯:先將陣列nums排序好,並宣告一個空陣列box,若該元素並未存在於box中則將其丟入,若存在則將其從box中拿出。由於nums已於一開始排序好了,因此box中最多也只會有一個element,因此最後回傳box[0]則是沒有重複的element!!

Ruby:

def single_number(nums)
  nums.sort!
  box = []
  nums.each_with_index do |num, index|
      if index == 0
        box << num
        next
      end
      if box[0] == nums[index]
        box.pop
      else
        box << num
      end
  end
  box[0]
end

其實題目還有另外要求不要使用多餘的記憶體空間來操作矩陣,但我寫的太快了,直到用JavaScript寫時才發現。另外題目還有要求runtime必須為O(n),表示不能用兩層迴圈來一個個檢查!綜合上述兩點JavaScript我決定換個方式寫寫看

思考邏輯:我會先將nums頭部element取出並放入變數a中,假如拿出後的nums中還有與a相同的element則將其刪除,若沒有表示它沒有重複,就直接return a。由於題目的input中一定會有一個重複的element,因此while迴圈的條件就算隨便設(會動就好),也不會陷入無窮迴圈。

JavaScript:

var singleNumber = function(nums) {
    while(true){
        let a = nums.shift()
        if(nums.indexOf(a) === -1){
            return a
        }else{
            nums.splice(nums.indexOf(a),1)
        } 
    }
};

小結:

  • Array.indexOf(element)這個method,若Array中有這個element則會回傳它在Array中的位置(index),若沒有這個element則回傳-1。
  • JavaScript刪除陣列element其實有很多方法,像是之前介紹的pop、shift是刪除頭尾的element,若要刪除裡面的element的話可以使用splice或是用delete,差別在於splice使用後會改變陣列長度,而delete不會,它是將刪除的element變成undefined
  • 難得這次JavaScript寫法比較短,難道我的JS進步了?!歡迎大家分享自己的寫法喔!! : )

上一篇
刷LeetCode-Top Interview Questions 陣列篇3
下一篇
刷LeetCode-Top Interview Questions 陣列篇5
系列文
挑戰用JavaScript刷LeetCode的Top Interview Questions7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言